home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / ELECTRON / PCB_DESI / H027.ZIP / TOOLS.EXE / lha / SMARTCON.PAS < prev   
Pascal/Delphi Source File  |  1990-11-21  |  26KB  |  658 lines

  1. program smartcon;
  2.  
  3. uses  Crt;
  4.  
  5. const bufsize                 = 64000;
  6.  
  7. type  directions              = (up,down,right,left,
  8.                                  upright,upleft,dnright,dnleft);
  9.  
  10. var   infile                  : file;
  11.       outfile                 : text;
  12.  
  13.       filhead                 : record
  14.       code                    : array [0..3] of char;
  15.       dummy                   : array [4..9] of byte;
  16.       headx                   : integer;
  17.       heady                   : integer;
  18.       rest                    : integer;
  19.       end;
  20.  
  21.       lbuffer                 : array [0..bufsize] of byte;
  22.       flen,plen,xmax,ymax     : integer;
  23.       padcnt,junction         : integer;
  24.       lincnt,barcnt           : integer;
  25.       traceend                : boolean;
  26.       direction,olddir,sdir   : directions;
  27.  
  28.       ch                      : char;
  29.  
  30. function GETSYMBOL (xcor,ycor,page: integer): integer;
  31. var   adr       : integer;
  32.  
  33. begin
  34.   adr := plen*page+trunc(ycor*(xmax shr 1) + (xcor shr 1));
  35. {  if (adr > bufsize) or (adr<0)
  36.                then ch:=readkey; }
  37.   if (xcor and 1)=0 then getsymbol := (lbuffer[adr] shr 4) and 15
  38.                     else getsymbol := lbuffer[adr] and 15;
  39. end; { von getsymbol }
  40.  
  41. procedure PUTSYMBOL (xcor,ycor,page,symbol: integer);
  42. var   adr       : integer;
  43.  
  44. begin
  45.   adr := plen*page+trunc(ycor*(xmax shr 1) +(xcor shr 1));
  46.   if (xcor and 1)=0 then lbuffer[adr] := symbol*16+lbuffer[adr] and 15
  47.                     else lbuffer[adr] := symbol+lbuffer[adr] and 240;
  48. end; { von putsymbol }
  49.  
  50. procedure SETPAD (xcor,ycor : integer);
  51. var   offx,offy    : integer;
  52.  
  53. begin
  54.   offx := 64*xcor; offy := -64*ycor; write (outfile,chr(1),chr(186));
  55.   write (outfile,chr(lo(offx)),chr(hi(offx)),chr(lo(offy)),chr(hi(offy)));
  56. end; { von setpad }
  57.  
  58. procedure GETPADS (page : integer);
  59. var       loopx,loopy :   integer;
  60.  
  61. begin
  62.   padcnt := 0;
  63.   for loopy :=0 to ymax-1 do
  64.     for loopx := 0 to xmax-1 do
  65.      if getsymbol(loopx,loopy,page)=14 then begin
  66.         padcnt := padcnt+1; gotoxy(1,wherey);
  67.         write ('create LAYER 0 : transfering PAD  : ',padcnt:4);
  68.         setpad(loopx,loopy);
  69.      end; { von if }
  70.      if padcnt>0 then begin writeln; writeln; end;
  71. end; { von getpads }
  72.  
  73. procedure DOJUNCTION (xcor,ycor,page,symbol,junction : integer);
  74. var   offx,offy,diff : integer;
  75.  
  76. begin
  77.   gotoxy(1,wherey);
  78.   write('create LAYER ',page+1:1,' : replace JUNCTION : ',junction:4);
  79.   offx := 64*xcor; offy := -64*ycor;
  80.   write (outfile,chr(0),chr(8*page+8));
  81.   write (outfile,chr(lo(offx)),chr(hi(offx)),chr(lo(offy)),chr(hi(offy)));
  82.   case symbol of
  83.         7 : begin offy := offy-32; putsymbol(xcor,ycor,page,6); end;
  84.         8 : begin offx := offx+32; putsymbol(xcor,ycor,page,5); end;
  85.         9 : begin offy := offy+32; putsymbol(xcor,ycor,page,6); end;
  86.        10 : begin offx := offx-32; putsymbol(xcor,ycor,page,5); end;
  87.        end; { von case }
  88.   write (outfile,chr(0),chr(8*page+9));
  89.   write (outfile,chr(lo(offx)),chr(hi(offx)),chr(lo(offy)),chr(hi(offy)));
  90. end; { von dojunction }
  91.  
  92. procedure GETJUNCTION (page : integer);
  93. var       loopx,loopy,symbol : integer;
  94.  
  95. begin
  96.   junction := 0;
  97.   for loopy :=0 to ymax-1 do
  98.     for loopx := 0 to xmax-1 do begin
  99.       symbol := getsymbol(loopx,loopy,page);
  100.       if (symbol>6) and (symbol<11) then begin
  101.          junction := junction+1;
  102.          dojunction(loopx,loopy,page,symbol,junction);
  103.       end; { von if }
  104.     end; { von for }
  105.     if junction>0 then writeln;
  106. end; { von getjunction }
  107.  
  108. procedure DOTRACE (page,mode,xcor,ycor,offx,offy : integer);
  109.  
  110. begin
  111.   offx := offx+64*xcor; offy := offy-64*ycor;
  112.   write (outfile,chr(0),chr(8*page+8+mode));
  113.   write (outfile,chr(lo(offx)),chr(hi(offx)),chr(lo(offy)),chr(hi(offy)));
  114. end; { von dotrace }
  115.  
  116. procedure TRACEUP (var xcor,ycor,flag : integer; page,mode : integer);
  117. var       sy : integer;
  118.  
  119. begin
  120.   sy := getsymbol(xcor,ycor,page);
  121.   while (ycor<ymax) and (sy=5) or (sy=11) do
  122.     begin
  123.       if mode=1 then
  124.          if sy=5 then putsymbol(xcor,ycor,page,0)
  125.                  else putsymbol(xcor,ycor,page,6);
  126.       ycor := ycor+1;
  127.       sy := getsymbol(xcor,ycor,page);
  128.     end; { von while }
  129.   if (ycor=ymax) or (sy=0) or (sy=1) or (sy=2) or (sy=6) or (sy=15) then
  130.      begin
  131.        dotrace(page,mode,xcor,ycor,0,32); traceend := true;
  132.        ycor := ycor-1; olddir := direction; direction := down;
  133.      end { von then }
  134.   else if sy=14 then
  135.           begin
  136.             dotrace(page,mode,xcor,ycor,0,32); traceend := true;
  137.             ycor := ycor-1; olddir := direction; direction := down;
  138.           end { von then }
  139.        else begin
  140.               case sy of
  141.                 3: begin olddir := direction; direction := upright; end;
  142.                 4: begin olddir := direction; direction := upleft; end;
  143.                12: begin olddir := direction; direction := upright; end;
  144.                13: begin olddir := direction; direction := upleft; end;
  145.               end; { von case }
  146.               flag := 0;
  147.               if mode=1 then dotrace(page,mode,xcor,ycor,0,32);
  148.        end; { von else }
  149. end; { von traceup }
  150.  
  151. procedure TRACEDOWN (var xcor,ycor,flag : integer; page,mode : integer);
  152. var       sy : integer;
  153.  
  154. begin
  155.   sy := getsymbol(xcor,ycor,page);
  156.   while (ycor>-1) and (sy=5) or (sy=11) do
  157.     begin
  158.       if mode=1 then
  159.          if sy=5 then putsymbol(xcor,ycor,page,0)
  160.                  else putsymbol(xcor,ycor,page,6);
  161.       ycor := ycor-1;
  162.       sy := getsymbol(xcor,ycor,page);
  163.     end; { von while }
  164.   if (ycor=-1) or (sy=0) or (sy=3) or (sy=4) or (sy=6) or (sy=15) then
  165.      begin
  166.        dotrace(page,mode,xcor,ycor,0,-32); traceend := true;
  167.        ycor := ycor+1; olddir := direction; direction := up;
  168.      end { von then }
  169.   else if sy=14 then
  170.           begin
  171.             dotrace(page,mode,xcor,ycor,0,-32); traceend := true;
  172.             ycor := ycor+1; olddir := direction; direction := up;
  173.           end { von then }
  174.        else begin
  175.               case sy of
  176.                 1: begin olddir := direction; direction := dnleft; end;
  177.                 2: begin olddir := direction; direction := dnright; end;
  178.                12: begin olddir := direction; direction := dnleft; end;
  179.                13: begin olddir := direction; direction := dnright; end;
  180.               end; { von case }
  181.               flag := 0;
  182.               if mode=1 then dotrace(page,mode,xcor,ycor,0,-32);
  183.        end; { von else }
  184. end; { von tracedown }
  185.  
  186. procedure TRACERIGHT (var xcor,ycor,flag : integer; page,mode : integer);
  187. var       sy : integer;
  188.  
  189. begin
  190.   sy := getsymbol(xcor,ycor,page);
  191.   while (xcor<xmax) and (sy=6) or (sy=11) do
  192.     begin
  193.       if mode=1 then
  194.          if sy=6 then putsymbol(xcor,ycor,page,0)
  195.                  else putsymbol(xcor,ycor,page,5);
  196.       xcor := xcor+1;
  197.       sy := getsymbol(xcor,ycor,page);
  198.     end; { von while }
  199.   if (xcor=xmax) or (sy=0) or (sy=2) or (sy=3) or (sy=5) or (sy=15) then
  200.      begin
  201.        dotrace(page,mode,xcor,ycor,-32,0); traceend := true;
  202.        xcor := xcor-1; olddir := direction; direction := left;
  203.      end { von then }
  204.   else if sy=14 then
  205.           begin
  206.             dotrace(page,mode,xcor,ycor,-32,0); traceend := true;
  207.             xcor := xcor-1; olddir := direction; direction := left;
  208.           end { von then }
  209.        else begin
  210.               case sy of
  211.                 1: begin olddir := direction; direction := upright; end;
  212.                 4: begin olddir := direction; direction := dnright; end;
  213.                12: begin olddir := direction; direction := upright; end;
  214.                13: begin olddir := direction; direction := dnright; end;
  215.               end; { von case }
  216.               flag := 1;
  217.               if mode=1 then dotrace(page,mode,xcor,ycor,-32,0);
  218.        end; { von else }
  219. end; { von traceright }
  220.  
  221. procedure TRACELEFT (var xcor,ycor,flag : integer; page,mode : integer);
  222. var       sy : integer;
  223.  
  224. begin
  225.   sy := getsymbol(xcor,ycor,page);
  226.   while (xcor>-1) and (sy=6) or (sy=11) do
  227.     begin
  228.       if mode=1 then
  229.          if sy=6 then putsymbol(xcor,ycor,page,0)
  230.                  else putsymbol(xcor,ycor,page,5);
  231.       xcor := xcor-1;
  232.       sy := getsymbol(xcor,ycor,page);
  233.     end; { von while }
  234.   if (xcor=-1) or (sy=0) or (sy=1) or (sy=4) or (sy=5) or (sy=15) then
  235.      begin
  236.        dotrace(page,mode,xcor,ycor,32,0); traceend := true;
  237.        xcor := xcor+1; olddir := direction; direction := right;
  238.      end { von then }
  239.   else if sy=14 then
  240.           begin
  241.             dotrace(page,mode,xcor,ycor,32,0); traceend := true;
  242.             xcor := xcor+1; olddir := direction; direction := right;
  243.           end { von then }
  244.        else begin
  245.               case sy of
  246.                 2: begin olddir := direction; direction := upleft; end;
  247.                 3: begin olddir := direction; direction := dnleft; end;
  248.                12: begin olddir := direction; direction := dnleft; end;
  249.                13: begin olddir := direction; direction := upleft; end;
  250.               end; { von case }
  251.               flag := 1;
  252.               if mode=1 then dotrace(page,mode,xcor,ycor,32,0);
  253.        end; { von else }
  254. end; { von traceleft }
  255.  
  256. procedure TRACEUPRIGHT (var xcor,ycor,flag : integer; page,mode : integer);
  257. var       sy : integer;
  258.  
  259. begin
  260.   sy := getsymbol(xcor,ycor,page);
  261.   while (xcor<xmax) and (ycor<ymax) and (sy=12) or
  262.         ((flag=0) and (sy=3)) or ((flag=1) and (sy=1)) do
  263.     begin
  264.       if mode=1 then
  265.          if (sy=1) or (sy=3) then putsymbol(xcor,ycor,page,0) else
  266.             if flag=0 then putsymbol(xcor,ycor,page,1)
  267.                       else putsymbol(xcor,ycor,page,3);
  268.       if flag=0 then xcor := xcor+1 else ycor := ycor+1;
  269.       sy := getsymbol(xcor,ycor,page);
  270.       flag := 1-flag;
  271.     end; { von while }
  272.   if flag=1 then
  273.     if (xcor=xmax) or (sy=0) or (sy=2) or (sy=3) or (sy=5) or (sy=15) then
  274.        begin
  275.          dotrace(page,mode,xcor,ycor,-32,0); traceend := true;
  276.          xcor := xcor-1; olddir := direction; direction := dnleft;
  277.        end { von then }
  278.     else if sy=14 then
  279.             begin
  280.               dotrace(page,mode,xcor,ycor,-32,0); traceend := true;
  281.               xcor := xcor-1; olddir := direction; direction := dnleft;
  282.             end { von then }
  283.          else begin
  284.                 case sy of
  285.                   4: begin olddir := direction; direction := dnright; end;
  286.                   6: begin olddir := direction; direction := right; end;
  287.                  11: begin olddir := direction; direction := right; end;
  288.                  13: begin olddir := direction; direction := dnright; end;
  289.                 end; { von case }
  290.                 if mode=1 then dotrace(page,mode,xcor,ycor,-32,0);
  291.          end { von else }
  292.   else
  293.     if (ycor=ymax) or (sy=0) or (sy=1) or (sy=2) or (sy=6) or (sy=15) then
  294.        begin
  295.          dotrace(page,mode,xcor,ycor,0,32); traceend := true;
  296.          ycor := ycor-1; olddir := direction; direction := dnleft;
  297.        end { von then }
  298.     else if sy=14 then
  299.             begin
  300.               dotrace(page,mode,xcor,ycor,0,32); traceend := true;
  301.               ycor := ycor-1; olddir := direction; direction := dnleft;
  302.             end { von then }
  303.          else begin
  304.                 case sy of
  305.                   4: begin olddir := direction; direction := upleft; end;
  306.                   5: begin olddir := direction; direction := up; end;
  307.                  11: begin olddir := direction; direction := up; end;
  308.                  13: begin olddir := direction; direction := upleft; end;
  309.                 end; { von case }
  310.                 if mode=1 then dotrace(page,mode,xcor,ycor,0,32);
  311.          end; { von else }
  312. end; { von traceupright }
  313.  
  314. procedure TRACEUPLEFT (var xcor,ycor,flag : integer; page,mode : integer);
  315. var       sy : integer;
  316.  
  317. begin
  318.   sy := getsymbol(xcor,ycor,page);
  319.   while (xcor>-1) and (ycor<ymax) and (sy=13) or
  320.         ((flag=0) and (sy=4)) or ((flag=1) and (sy=2)) do
  321.     begin
  322.       if mode=1 then
  323.          if (sy=2) or (sy=4) then putsymbol(xcor,ycor,page,0) else
  324.             if flag=0 then putsymbol(xcor,ycor,page,2)
  325.                       else putsymbol(xcor,ycor,page,4);
  326.       if flag=0 then xcor := xcor-1 else ycor := ycor+1;
  327.       sy := getsymbol(xcor,ycor,page);
  328.       flag := 1-flag;
  329.     end; { von while }
  330.   if flag=1 then
  331.     if (xcor=-1) or (sy=0) or (sy=1) or (sy=4) or (sy=5) or (sy=15) then
  332.        begin
  333.          dotrace(page,mode,xcor,ycor,32,0); traceend := true;
  334.          xcor := xcor+1; olddir := direction; direction := dnright;
  335.        end { von then }
  336.     else if sy=14 then
  337.             begin
  338.               dotrace(page,mode,xcor,ycor,32,0); traceend := true;
  339.               xcor := xcor+1; olddir := direction; direction := dnright;
  340.             end { von then }
  341.          else begin
  342.                 case sy of
  343.                   3: begin olddir := direction; direction := dnleft; end;
  344.                   6: begin olddir := direction; direction := left; end;
  345.                  11: begin olddir := direction; direction := left; end;
  346.                  12: begin olddir := direction; direction := dnleft; end;
  347.                 end; { von case }
  348.                 if mode=1 then dotrace(page,mode,xcor,ycor,32,0);
  349.          end { von else }
  350.   else
  351.     if (ycor=ymax) or (sy=0) or (sy=1) or (sy=2) or (sy=6) or (sy=15) then
  352.        begin
  353.          dotrace(page,mode,xcor,ycor,0,32); traceend := true;
  354.          ycor := ycor-1; olddir := direction; direction := dnright;
  355.        end { von then }
  356.     else if sy=14 then
  357.             begin
  358.               dotrace(page,mode,xcor,ycor,0,32); traceend := true;
  359.               ycor := ycor-1; olddir := direction; direction := dnright;
  360.             end { von then }
  361.          else begin
  362.                 case sy of
  363.                   3: begin olddir := direction; direction := upright; end;
  364.                   5: begin olddir := direction; direction := up; end;
  365.                  11: begin olddir := direction; direction := up; end;
  366.                  12: begin olddir := direction; direction := upright; end;
  367.                 end; { von case }
  368.                 if mode=1 then dotrace(page,mode,xcor,ycor,0,32);
  369.          end; { von else }
  370. end; { von traceupleft }
  371.  
  372. procedure TRACEDNRIGHT (var xcor,ycor,flag : integer; page,mode : integer);
  373. var       sy : integer;
  374.  
  375. begin
  376.   sy := getsymbol(xcor,ycor,page);
  377.   while (xcor<xmax) and (ycor>-1) and (sy=13) or
  378.         ((flag=0) and (sy=2)) or ((flag=1) and (sy=4)) do
  379.     begin
  380.       if mode=1 then
  381.          if (sy=2) or (sy=4) then putsymbol(xcor,ycor,page,0) else
  382.             if flag=0 then putsymbol(xcor,ycor,page,4)
  383.                       else putsymbol(xcor,ycor,page,2);
  384.       if flag=0 then xcor := xcor+1 else ycor := ycor-1;
  385.       sy := getsymbol(xcor,ycor,page);
  386.       flag := 1-flag;
  387.     end; { von while }
  388.   if flag=1 then
  389.     if (xcor=xmax) or (sy=0) or (sy=2) or (sy=3) or (sy=5) or (sy=15) then
  390.        begin
  391.          dotrace(page,mode,xcor,ycor,-32,0); traceend := true;
  392.          xcor := xcor-1; olddir := direction; direction := upleft;
  393.        end { von then }
  394.     else if sy=14 then
  395.             begin
  396.               dotrace(page,mode,xcor,ycor,-32,0); traceend := true;
  397.               xcor := xcor-1; olddir := direction; direction := upleft;
  398.             end { von then }
  399.          else begin
  400.                 case sy of
  401.                   1: begin olddir := direction; direction := upright; end;
  402.                   6: begin olddir := direction; direction := right; end;
  403.                  11: begin olddir := direction; direction := right; end;
  404.                  12: begin olddir := direction; direction := upright; end;
  405.                 end; { von case }
  406.                 if mode=1 then dotrace(page,mode,xcor,ycor,-32,0);
  407.          end { von else }
  408.   else
  409.     if (ycor=-1) or (sy=0) or (sy=3) or (sy=4) or (sy=6) or (sy=15) then
  410.        begin
  411.          dotrace(page,mode,xcor,ycor,0,-32); traceend := true;
  412.          ycor := ycor+1; olddir := direction; direction := upleft;
  413.        end { von then }
  414.     else if sy=14 then
  415.             begin
  416.               dotrace(page,mode,xcor,ycor,0,-32); traceend := true;
  417.               ycor := ycor+1; olddir := direction; direction := upleft;
  418.             end { von then }
  419.          else begin
  420.                 case sy of
  421.                   1: begin olddir := direction; direction := dnleft; end;
  422.                   5: begin olddir := direction; direction := down; end;
  423.                  11: begin olddir := direction; direction := down; end;
  424.                  12: begin olddir := direction; direction := dnleft; end;
  425.                 end; { von case }
  426.                 if mode=1 then dotrace(page,mode,xcor,ycor,0,-32);
  427.          end; { von else }
  428. end; { von tracednright }
  429.  
  430. procedure TRACEDNLEFT (var xcor,ycor,flag : integer; page,mode : integer);
  431. var       sy : integer;
  432.  
  433. begin
  434.   sy := getsymbol(xcor,ycor,page);
  435.   while (xcor>-1) and (ycor>-1) and (sy=12) or
  436.         ((flag=0) and (sy=1)) or ((flag=1) and (sy=3)) do
  437.     begin
  438.       if mode=1 then
  439.          if (sy=1) or (sy=3) then putsymbol(xcor,ycor,page,0) else
  440.             if flag=0 then putsymbol(xcor,ycor,page,3)
  441.                       else putsymbol(xcor,ycor,page,1);
  442.       if flag=0 then xcor := xcor-1 else ycor := ycor-1;
  443.       sy := getsymbol(xcor,ycor,page);
  444.       flag := 1-flag;
  445.     end; { von while }
  446.   if flag=1 then
  447.     if (xcor=-1) or (sy=0) or (sy=1) or (sy=4) or (sy=5) or (sy=15) then
  448.        begin
  449.          dotrace(page,mode,xcor,ycor,32,0); traceend := true;
  450.          xcor := xcor+1; olddir := direction; direction := upright;
  451.        end { von then }
  452.     else if sy=14 then
  453.             begin
  454.               dotrace(page,mode,xcor,ycor,32,0); traceend := true;
  455.               xcor := xcor+1; olddir := direction; direction := upright;
  456.             end { von then }
  457.          else begin
  458.                 case sy of
  459.                   2: begin olddir := direction; direction := upleft; end;
  460.                   6: begin olddir := direction; direction := left; end;
  461.                  11: begin olddir := direction; direction := left; end;
  462.                  13: begin olddir := direction; direction := upleft; end;
  463.                 end; { von case }
  464.                 if mode=1 then dotrace(page,mode,xcor,ycor,32,0);
  465.          end { von else }
  466.   else
  467.     if (ycor=-1) or (sy=0) or (sy=3) or (sy=4) or (sy=6) or (sy=15) then
  468.        begin
  469.          dotrace(page,mode,xcor,ycor,0,-32); traceend := true;
  470.          ycor := ycor+1; olddir := direction; direction := upright;
  471.        end { von then }
  472.     else if sy=14 then
  473.             begin
  474.               dotrace(page,mode,xcor,ycor,0,-32); traceend := true;
  475.               ycor := ycor+1; olddir := direction; direction := upright;
  476.             end { von then }
  477.          else begin
  478.                 case sy of
  479.                   2: begin olddir := direction; direction := dnright; end;
  480.                   5: begin olddir := direction; direction := down; end;
  481.                  11: begin olddir := direction; direction := down; end;
  482.                  13: begin olddir := direction; direction := dnright; end;
  483.                 end; { von case }
  484.                 if mode=1 then dotrace(page,mode,xcor,ycor,0,-32);
  485.          end; { von else }
  486. end; { von tracednleft }
  487.  
  488. procedure TRACELINE (strtx,strty,page : integer);
  489. var xcor,ycor,mode,sy,flag,sflag : integer;
  490.     key               : char;
  491.  
  492. begin
  493.   mode := 0;
  494.   traceend := false;
  495.   xcor := strtx; ycor := strty;
  496.   sy := getsymbol(xcor,ycor,page);
  497.   case sy of
  498.        1: begin direction := upright; flag := 1; end;
  499.        2: begin direction := dnright; flag := 0; end;
  500.        3: begin direction := upright; flag := 0; end;
  501.        4: begin direction := dnright; flag := 1; end;
  502.        5: begin direction := up;      flag := 0; end;
  503.        6: begin direction := right;   flag := 0; end;
  504.       11: begin direction := right;   flag := 0; end;
  505.       12: begin direction := upright; flag := 1; end;
  506.       13: begin direction := dnright; flag := 1; end;
  507.       end; { von case }
  508.   sdir := direction; sflag := flag;
  509.   repeat
  510.     { writeln (xcor:4,ycor:4,ord(direction):4); }
  511.     case direction of
  512.          up      : traceup(xcor,ycor,flag,page,mode);
  513.          down    : tracedown(xcor,ycor,flag,page,mode);
  514.          right   : traceright(xcor,ycor,flag,page,mode);
  515.          left    : traceleft(xcor,ycor,flag,page,mode);
  516.          upright : traceupright(xcor,ycor,flag,page,mode);
  517.          upleft  : traceupleft(xcor,ycor,flag,page,mode);
  518.          dnright : tracednright(xcor,ycor,flag,page,mode);
  519.          dnleft  : tracednleft(xcor,ycor,flag,page,mode);
  520.          end; { von case }
  521.   until (traceend=true) or
  522.         ((direction=sdir) and (flag=sflag) and (xcor=strtx) and (ycor=strty));
  523.   if traceend=false then dotrace(page,mode,xcor,ycor,0,-32);
  524.   traceend := false;
  525.   mode := 1;
  526.   repeat
  527.   { writeln (xcor:4,ycor:4,ord(direction):4); }
  528.     case direction of
  529.          up      : traceup(xcor,ycor,flag,page,mode);
  530.          down    : tracedown(xcor,ycor,flag,page,mode);
  531.          right   : traceright(xcor,ycor,flag,page,mode);
  532.          left    : traceleft(xcor,ycor,flag,page,mode);
  533.          upright : traceupright(xcor,ycor,flag,page,mode);
  534.          upleft  : traceupleft(xcor,ycor,flag,page,mode);
  535.          dnright : tracednright(xcor,ycor,flag,page,mode);
  536.          dnleft  : tracednleft(xcor,ycor,flag,page,mode);
  537.          end; { von case }
  538.   until traceend=true;
  539. end; { von traceline }
  540.  
  541. procedure GETLINES (page : integer);
  542. var       loopx,loopy,sy : integer;
  543.  
  544. begin
  545.   lincnt := 0;
  546.   for loopy :=0 to ymax-1 do
  547.     for loopx := 0 to xmax-1 do
  548.         begin
  549.           sy := getsymbol(loopx,loopy,page);
  550.           if (sy>0) and (sy<14) then
  551.              begin
  552.                lincnt := lincnt+1; gotoxy(1,wherey);
  553.                if junction=0 then write ('create LAYER ',page+1:1)
  554.                              else write ('              ');
  555.                write(' : rerouting TRACE  : ',lincnt:4);
  556.                traceline(loopx,loopy,page);
  557.              end; { von if }
  558.         end; { von for }
  559.   if lincnt>0 then writeln;
  560. end; { von getlines }
  561.  
  562. procedure DOBAR (page,mode,xcor,ycor,offx,offy : integer);
  563.  
  564. begin
  565.   offx := offx+64*xcor; offy := offy-64*ycor;
  566.   write (outfile,chr(0),chr(8*(page+2)+8+3*mode));
  567.   write (outfile,chr(lo(offx)),chr(hi(offx)),chr(lo(offy)),chr(hi(offy)));
  568. end; { von dobar }
  569.  
  570. procedure GETBARS (page : integer);
  571. var       loopx,loopy,sy1,sy2 : integer;
  572.  
  573. begin
  574.   barcnt := 0;
  575.   for loopy :=0 to ymax-1 do
  576.     begin
  577.       loopx := 0;
  578.       sy1 := getsymbol(loopx,loopy,page);
  579.       sy2 := getsymbol(loopx+1,loopy,page);
  580.       repeat
  581.         while (loopx<xmax-1) and ((sy1<>15) or (sy2<>15)) do
  582.           begin
  583.             loopx := loopx+1;
  584.             sy1 := getsymbol(loopx,loopy,page);
  585.             sy2 := getsymbol(loopx+1,loopy,page);
  586.           end;
  587.         if loopx<xmax-1 then
  588.            begin
  589.              barcnt := barcnt+1; gotoxy(1,wherey);
  590.              write ('create LAYER ',page+3:1,' : simulate FATWIRE : ',barcnt:4);
  591.              dobar(page,0,loopx,loopy,0,0);
  592.              while (loopx<xmax) and (sy1=15) do
  593.                begin
  594.                  putsymbol(loopx,loopy,page,0);
  595.                  loopx := loopx+1;
  596.                  sy1 := getsymbol(loopx,loopy,page);
  597.                end;
  598.              dobar(page,1,loopx-1,loopy,0,0);
  599.            end;
  600.       until loopx>xmax-2;
  601.     end;
  602.   for loopx :=0 to xmax-1 do
  603.     begin
  604.       loopy := 0;
  605.       sy1 := getsymbol(loopx,loopy,page);
  606.       repeat
  607.         while (loopy<ymax) and (sy1<>15) do
  608.           begin
  609.             loopy := loopy+1;
  610.             sy1 := getsymbol(loopx,loopy,page);
  611.           end;
  612.         if loopy<ymax then
  613.            begin
  614.              barcnt := barcnt+1; gotoxy(1,wherey);
  615.              write ('create LAYER ',page+3:1,' : simulate FATWIRE : ',barcnt:4);
  616.              dobar(page,0,loopx,loopy,0,1);
  617.              while (loopy<ymax) and (sy1=15) do
  618.                begin
  619.                  putsymbol(loopx,loopy,page,0);
  620.                  loopy := loopy+1;
  621.                  sy1 := getsymbol(loopx,loopy,page);
  622.                end;
  623.              dobar(page,1,loopx,loopy-1,0,-1);
  624.            end;
  625.       until loopy=ymax;
  626.     end;
  627.     if barcnt>0 then writeln;
  628.     writeln;
  629. end; { von getbars }
  630.  
  631. begin
  632.   lowvideo;
  633.   writeln;
  634.   writeln ('smARTWORK - LAYO1 Datenkonverter Version 1.1');
  635.   writeln ('CD-Elektronik,Saarwellingen. (c)88 M+M Comtech.');
  636.   writeln;
  637.   if ParamCount=2 then begin
  638.     assign (infile,paramstr(1));
  639.     (*$I-*) reset (infile,1); (*$I+*)
  640.     if IOResult=0 then begin
  641.       blockread (infile,filhead,16);
  642.       with filhead do begin xmax := headx; ymax := heady; end;
  643.       flen := xmax*ymax; plen := flen shr 1;
  644.       blockread (infile,lbuffer,flen);
  645.       close (infile);
  646.       assign (outfile,paramstr(2));
  647.       (*$I-*) rewrite (outfile); (*$I+*)
  648.       if IOResult=0 then begin
  649.         getpads(0);
  650.         getjunction(0); getlines(0); getbars(0);
  651.         getjunction(1); getlines(1); getbars(1);
  652.         close(outfile);
  653.         writeln ('SUCCESS: DESIGN-TRANSLATION COMPLETED.');
  654.       end else writeln ('Outputfile ',paramstr(2),': opening failed.');
  655.     end else writeln ('Inputfile ',paramstr(1),': opening failed.');
  656.   end else writeln ('Call: SMARTCON smartfile layofile.bnk');
  657. end.
  658.